close all
clear all
clc

format long

%% Conxuntos de Adestramento

entrada = [5 -2 ; 3 4];
saidaDesexada = [12 2];

%% Valores para o Adestramento

lp.lr = 0.001; % Velocidade de aprendizaxe (Learning Rate)
error_maximo = 0.0001;

% Valores iniciais dos pesos
W = rand (1,2) * 10;

%% Adestramento do ADALINE usando a regra Delta
ecm = 10000;  % inicializacion necesaria da variable
max_iters=1000;

w1_ant = [];
w2_ant = [];
ecm_ant = [];

for i = 1:max_iters,
    if (ecm < error_maximo)
        break
    end

    saida = W * entrada;

    E = saidaDesexada - saida;
    
    % Calculamo-la variacion dos pesos
    dW = learnwh (W,entrada,[],[],[],saidaDesexada,E,[],[],[],lp,[]);
    % Variamos os pesos segundo nos di o a regra delta
    W = W + dW;
    
    w1_ant = [w1_ant W(1)];
    w2_ant= [w2_ant W(2)];
    
    ecm = 1/2 * (E(1)^2 + E(2)^2);
    ecm_ant= [ecm_ant ecm];
end

%% Representacions graficas dos resultados

% Obtemo-la superficie do erro en funcion dos pesos no intervalo -10:.2:10
% w1 y w2 son los W
w1 = -10:.2:10;
w2 = w1;
[a,b] = meshgrid (w1,w2);

% Superficie do erro
superficie = 1/2*((saidaDesexada(1)-(entrada(1,1).* a + entrada(2,1) .* b)).^2 + (entrada(1,2) .* a + entrada(2,2) .* b - saidaDesexada(2)).^2);

figure (1);
  subplot(1,2,1)  
    surf (w1,w2,superficie);
    title ('superficie do erro en 3D que se trata de minimizar');
    grid on
    hold on
    plot3 (w1_ant,w2_ant,ecm_ant,'r*');
    hold off
  subplot(1,2,2)
    contour (w1,w2,superficie);
    title ('superficie do erro en 2D que se trata de minimizar');
    grid on
    hold on
    plot3 (w1_ant,w2_ant,ecm_ant,'r*');
    hold off








